/*
 * Copyright (c) 2016 Miles Sabin
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package shapeless.examples

import shapeless._

/**
  * Shows how to inject a runtime value of type `Any` in
  * `Coproduct`.
  *
  * @author Juan José Vázquez Delgado
  */
object CoproductRuntimeInject extends App {

  case class Foo(msg: String)

  type FooIS = Foo :+: Int :+: String :+: CNil

  val foo  = Coproduct.runtimeInject[FooIS](Foo("msg"): Any)
  val bar  = Coproduct.runtimeInject[FooIS](23: Any)
  val baz  = Coproduct.runtimeInject[FooIS]("baz": Any)
  val ouch = Coproduct.runtimeInject[FooIS](true: Any)

  import syntax.inject._
  val infix = 23.runtimeInject[FooIS]

  assert(foo  == Option(Inl(Foo("msg"))))
  assert(bar  == Option(Inr(Inl(23))))
  assert(baz  == Option(Inr(Inr(Inl("baz")))))
  assert(ouch == Option.empty[FooIS])
  assert(infix == bar)
}
